package cn.virens.server.tio_tcp;

import java.util.concurrent.atomic.AtomicInteger;

import org.tio.core.ChannelContext;
import org.tio.core.Tio;

import cn.virens.server.tio_tcp.packet.TioWritePacket;

public class TIOServerUtil {
	/** 获取 设备IMSI地址 */
	public static String imsi(ChannelContext channelContext) {
		return channelContext.getBsId();
	}

	/** 绑定 设备IMSI地址 */
	public static void bindImsi(ChannelContext channelContext, String imsi) {
		Tio.bindBsId(channelContext, imsi);
	}

	/** 解绑 设备IMSI地址 */
	public static void unbindImsi(ChannelContext channelContext) {
		Tio.unbindBsId(channelContext);
	}

	/** 获取 设备TOKEN */
	public static String token(ChannelContext channelContext) {
		return channelContext.getToken();
	}

	/** 绑定 设备TOKEN */
	public static void bindToken(ChannelContext channelContext, String token) {
		Tio.bindToken(channelContext, token);
	}

	/** 解绑 设备TOKEN */
	public static void unbindToken(ChannelContext channelContext) {
		Tio.unbindToken(channelContext);
	}

	/**
	 * 连接名称
	 * 
	 * @param  channelContext
	 * @return
	 */
	public static String name(ChannelContext channelContext) {
		return channelContext + "[" + imsi(channelContext) + "]";
	}

	/**
	 * 生成新的发送包
	 * 
	 * @param  channelContext
	 * @return
	 */
	public static TioWritePacket write(ChannelContext channelContext) {
		Object temp = channelContext.getAttribute("_sendTimers");

		AtomicInteger sendTimer = null;
		try {
			if (temp instanceof AtomicInteger) {
				sendTimer = (AtomicInteger) temp;
			} else {
				sendTimer = new AtomicInteger(0);
			}

			// 构建待发送包
			TioWritePacket tioWritePacket = new TioWritePacket();
			tioWritePacket.setSeq(sendTimer.incrementAndGet());

			return tioWritePacket;
		} finally {
			channelContext.setAttribute("_sendTimers", sendTimer);
		}
	}

	/**
	 * 发送指令通道
	 * 
	 * @param  channelContext 设备连接
	 * @param  packet         数据包
	 * @return
	 */
	public static boolean write(ChannelContext channelContext, TioWritePacket packet) {
		return Tio.send(channelContext, packet);
	}
}
